import 'package:flutter/material.dart';
import 'package:refresh_paging_listview/refresh_paging_listview.dart';
import 'package:slwl/utils/http.dart';
import 'package:slwl/utils/toast.dart';

// 任务数据模型（替换 dynamic，避免类型不安全）
class TaskModel {
  final String transportTaskId; // 任务编号
  final String startAddress; // 起点地址
  final String endAddress; // 终点地址
  final String startTime; // 提货开始时间
  final String endTime; // 提货结束时间
  final int status; // 任务状态（1-待提货，2-在途，6-已完成）
  final bool enablePickUp; // 是否允许提货
  final String createTime; // 任务创建时间（用于判断是否延迟）

  TaskModel({
    required this.transportTaskId,
    required this.startAddress,
    required this.endAddress,
    required this.startTime,
    required this.endTime,
    required this.status,
    required this.enablePickUp,
    required this.createTime,
  });

  // 从接口数据解析为模型
  factory TaskModel.fromJson(Map<String, dynamic> json) {
    return TaskModel(
      transportTaskId: json['transportTaskId'] ?? '',
      startAddress: json['startAddress'] ?? '未知起点',
      endAddress: json['endAddress'] ?? '未知终点',
      startTime: json['startTime'] ?? '',
      endTime: json['endTime'] ?? '',
      status: json['status'] ?? 0,
      enablePickUp: json['enablePickUp'] ?? false,
      createTime: json['createTime'] ?? '',
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  // Tab 配置：索引 -> (Tab文本, 对应status值)
  final List<Map<String, dynamic>> _tabConfig = [
    {'text': '待提货', 'status': 1},
    {'text': '在途', 'status': 2},
    {'text': '已完成', 'status': 6},
  ];
  int _tabIndex = 0; // 当前选中的Tab索引

  // 分页相关配置（集成 refresh_paging_listview）
  final RefreshController _refreshController =
      RefreshController(initialRefresh: false);
  List<TaskModel> _tasksList = []; // 任务列表（用模型替代 dynamic）
  int _pageNum = 1; // 当前页码
  final int _pageSize = 10; // 每页条数
  bool _hasMore = true; // 是否还有更多数据

  @override
  void initState() {
    super.initState();
    // 初始加载第一页数据
    _loadTasksList(isRefresh: true);
  }

  @override
  void dispose() {
    // 释放刷新控制器
    _refreshController.dispose();
    super.dispose();
  }

  /// 1. 加载任务列表（支持下拉刷新/上拉加载）
  Future<void> _loadTasksList({required bool isRefresh}) async {
    // 1.1 重置页码（下拉刷新时从第1页开始）
    if (isRefresh) {
      _pageNum = 1;
      _hasMore = true;
    }

    // 1.2 构造请求参数（从Tab配置中获取当前status）
    final params = {
      'pageNum': _pageNum,
      'pageSize': _pageSize,
      'status': _tabConfig[_tabIndex]['status'], // 关联Tab的status
    };

    try {
      // 1.3 发起网络请求
      final res = await http.get('/driver/tasks/list', params: params);
      print('任务列表请求结果：$res');

      if (res['code'] == 200) {
        final List<dynamic> dataList = res['data']['items'] ?? [];
        final List<TaskModel> newTasks =
            dataList.map((json) => TaskModel.fromJson(json)).toList();

        setState(() {
          if (isRefresh) {
            // 下拉刷新：覆盖原有数据
            _tasksList = newTasks;
          } else {
            // 上拉加载：追加数据
            _tasksList.addAll(newTasks);
          }
          // 判断是否还有更多数据（当前页数据小于pageSize → 没有更多）
          _hasMore = newTasks.length >= _pageSize;
        });

        // 1.4 更新刷新控制器状态
        if (isRefresh) {
          _refreshController.refreshCompleted();
        } else {
          _hasMore
              ? _refreshController.loadComplete()
              : _refreshController.loadNoData();
        }

        // 1.5 页码自增（仅上拉加载时）
        if (!isRefresh && _hasMore) {
          _pageNum++;
        }
      } else {
        // 请求成功但业务失败（如code≠200）
        ToastUtils.showError(res['msg'] ?? '获取任务列表失败');
        _handleLoadFailed(isRefresh);
      }
    } catch (e) {
      // 网络异常或请求失败
      print('获取任务列表异常：$e');
      ToastUtils.showError('网络异常，请稍后重试');
      _handleLoadFailed(isRefresh);
    }
  }

  /// 2. 处理加载失败（更新刷新控制器状态）
  void _handleLoadFailed(bool isRefresh) {
    if (isRefresh) {
      _refreshController.refreshFailed();
    } else {
      _refreshController.loadFailed();
    }
  }

  /// 3. 判断任务是否延迟（对比当前时间和提货结束时间）
  bool _isTaskDelayed(String endTime) {
    if (endTime.isEmpty) return false;

    try {
      // 解析提货结束时间（需根据接口返回的时间格式调整，这里假设是 "yyyy.MM.dd HH:mm"）
      final endDateTime = DateTime.parse(endTime.replaceAll('.', '-'));
      final now = DateTime.now();
      // 当前时间 > 提货结束时间 → 已延迟
      return now.isAfter(endDateTime);
    } catch (e) {
      print('时间解析异常：$e');
      return false;
    }
  }

  /// 4. 构建单个任务列表项
  Widget _buildTaskItem(TaskModel task) {
    // 判断当前任务是否延迟
    final isDelayed = _isTaskDelayed(task.endTime);

    return Container(
      padding: const EdgeInsets.symmetric(horizontal: 18, vertical: 15),
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(10),
      ),
      child: Column(
        children: [
          // 任务编号 + 延迟标签
          Row(
            children: [
              Text(
                '任务编号：${task.transportTaskId}',
                style: const TextStyle(
                  color: Color(0xFF2A2929),
                  fontSize: 16,
                  fontWeight: FontWeight.w600,
                ),
              ),
              const Spacer(),
              // 仅当延迟时显示标签
              if (isDelayed)
                Container(
                  width: 52,
                  height: 22,
                  alignment: Alignment.center,
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(11),
                    border:
                        Border.all(color: const Color(0xFFE52D21), width: 1),
                  ),
                  child: const Text(
                    '已延迟',
                    style: TextStyle(color: Color(0xFFEF4F3F), fontSize: 12),
                  ),
                ),
            ],
          ),

          // 起点-终点路线
          Container(
            margin: const EdgeInsets.only(top: 21),
            child: Row(
              children: [
                // 起/止点图标 + 连接线
                Container(
                  height: 88,
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      // 起点图标
                      Container(
                        width: 22,
                        height: 22,
                        alignment: Alignment.center,
                        decoration: BoxDecoration(
                          color: const Color(0xFF2A2929),
                          borderRadius: BorderRadius.circular(11),
                        ),
                        child: const Text('起',
                            style:
                                TextStyle(color: Colors.white, fontSize: 12)),
                      ),
                      // 中间连接线（垂直）
                      Expanded(
                        child: Container(
                          margin: const EdgeInsets.symmetric(vertical: 5),
                          width: 1,
                          decoration: const BoxDecoration(
                            border: Border(
                                left: BorderSide(
                                    color: Color(0xFF818181), width: 1)),
                          ),
                        ),
                      ),
                      // 终点图标
                      Container(
                        width: 22,
                        height: 22,
                        alignment: Alignment.center,
                        decoration: BoxDecoration(
                          color: const Color(0xFFEF4F3F),
                          borderRadius: BorderRadius.circular(11),
                        ),
                        child: const Text('止',
                            style:
                                TextStyle(color: Colors.white, fontSize: 12)),
                      ),
                    ],
                  ),
                ),

                // 起点/终点地址
                Expanded(
                  child: Container(
                    height: 88,
                    padding: const EdgeInsets.only(left: 16),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Text(
                          task.startAddress,
                          style: const TextStyle(
                              color: Color(0xFF818181), fontSize: 14),
                          maxLines: 1,
                          overflow: TextOverflow.ellipsis, // 地址过长时省略
                        ),
                        Text(
                          task.endAddress,
                          style: const TextStyle(
                              color: Color(0xFF818181), fontSize: 14),
                          maxLines: 1,
                          overflow: TextOverflow.ellipsis,
                        ),
                      ],
                    ),
                  ),
                ),
              ],
            ),
          ),

          // 分割线
          Container(
            margin: const EdgeInsets.only(top: 21),
            height: 1,
            color: const Color(0xFFeeeeee),
          ),

          // 提货时间 + 提货按钮
          Container(
            margin: const EdgeInsets.only(top: 14),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                // 提货时间
                Expanded(
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      const Text(
                        '提货时间',
                        style:
                            TextStyle(color: Color(0xFF818181), fontSize: 14),
                      ),
                      Text(
                        '${task.startTime}-${task.endTime}', // 显示时间范围
                        style: const TextStyle(
                            color: Color(0xFF2A2929), fontSize: 14),
                        maxLines: 1,
                        overflow: TextOverflow.ellipsis,
                      ),
                    ],
                  ),
                ),

                // 提货按钮（根据 enablePickUp 控制颜色）
                GestureDetector(
                  onTap: () {
                    if (task.enablePickUp) {
                      // 允许提货：跳转提货页面或执行提货逻辑
                      ToastUtils.showSuccess('前往提货：${task.transportTaskId}');
                    } else {
                      // 不允许提货：提示原因
                      ToastUtils.showInfo('当前任务暂不允许提货');
                    }
                  },
                  child: Container(
                    width: 70,
                    height: 30,
                    alignment: Alignment.center,
                    decoration: BoxDecoration(
                      color: task.enablePickUp
                          ? const Color(0xFFE52D21)
                          : const Color(0xFFFADCD9),
                      borderRadius: BorderRadius.circular(15),
                    ),
                    child: const Text(
                      '提货',
                      style: TextStyle(color: Colors.white, fontSize: 14),
                    ),
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: _tabConfig.length,
      child: Scaffold(
        backgroundColor: const Color(0xFFF4F4F4),
        appBar: AppBar(
          backgroundColor: Colors.white,
          automaticallyImplyLeading: false, // 取消返回按钮
          title: TabBar(
            onTap: (index) {
              // Tab 切换时重置列表并加载新数据
              if (_tabIndex != index) {
                setState(() => _tabIndex = index);
                // 触发下拉刷新效果，加载新Tab的第一页数据
                _refreshController.requestRefresh();
              }
            },
            labelColor: const Color(0xFF2A2929),
            unselectedLabelColor: const Color(0xFF818181),
            labelStyle:
                const TextStyle(fontSize: 16, fontWeight: FontWeight.w600),
            unselectedLabelStyle:
                const TextStyle(fontSize: 16, fontWeight: FontWeight.w600),

            dividerHeight: 0, // 取消TabBar默认下划线
            indicatorSize: TabBarIndicatorSize.label,
            indicator: const UnderlineTabIndicator(
              borderSide: BorderSide(color: Color(0xFFE52D21), width: 4),
              borderRadius: BorderRadius.all(Radius.circular(2)),
            ),
            splashFactory: NoSplash.splashFactory, // 取消点击水波纹
            tabAlignment: TabAlignment.center,
            tabs:
                _tabConfig.map((config) => Tab(text: config['text'])).toList(),
          ),
        ),

        // 2. 集成 refresh_paging_listview 实现下拉刷新/上拉加载
        body: SmartRefresher(
          controller: _refreshController,
          enablePullDown: true, // 启用下拉刷新
          enablePullUp: true, // 启用上拉加载
          header: const WaterDropHeader(
            refresh: CircularProgressIndicator(
                strokeWidth: 2, color: Color(0xFFE52D21)),
            complete: Icon(Icons.check, color: Color(0xFFE52D21)),
          ),
          footer: const ClassicFooter(
            loadingText: '加载中...',
            noDataText: '没有更多任务了',
            failedText: '加载失败，点击重试',
            textStyle: TextStyle(color: Color(0xFF818181), fontSize: 14),
          ),
          onRefresh: () => _loadTasksList(isRefresh: true), // 下拉刷新回调
          onLoading: () => _loadTasksList(isRefresh: false), // 上拉加载回调
          child: _tasksList.isEmpty
              ? // 空数据占位
              const Center(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Icon(Icons.inbox_outlined,
                          color: Color(0xFF818181), size: 60),
                      SizedBox(height: 16),
                      Text('暂无任务数据',
                          style: TextStyle(
                              color: Color(0xFF818181), fontSize: 16)),
                    ],
                  ),
                )
              : // 任务列表
              ListView.separated(
                  padding: const EdgeInsets.all(15),
                  itemCount: _tasksList.length,
                  separatorBuilder: (context, index) =>
                      const SizedBox(height: 15),
                  itemBuilder: (context, index) =>
                      _buildTaskItem(_tasksList[index]),
                ),
        ),
      ),
    );
  }
}

